package com.maas.util.mybatis.jpa.littlenb.mapper;


import com.littlenb.mybatisjpa.annotation.InsertDefinition;
import com.littlenb.mybatisjpa.annotation.UpdateDefinition;
import com.littlenb.mybatisjpa.support.Certainty;
import com.littlenb.mybatisjpa.support.Constant;
import com.littlenb.mybatisjpa.type.SelectorStrategy;

import com.maas.util.mybatis.jpa.littlenb.annotation.mapper.InsertExDefinition;
import com.maas.util.mybatis.jpa.littlenb.annotation.mapper.SelectDefinition;

import java.util.List;

/**
 * jpa 基础类
 * 实现 jpa 功能，减少 编辑 sql 语句
 * 提供基础的增删查改功能
 * //TODO 现在每个方法必须传参数，改为可以不传参数
 * @author sway.li
 **/
public interface JpaIBaseMapper<T> {


  //@InsertDefinition
  @InsertExDefinition
  /**
   * insertxxx 暂时支持long 类型的 id
   * TODO 编写 InsertPlusDefinition 支持更加复杂的插入语句
   * @param t
   * @return
   */
  int insertJbaBatch(List<T> t);

  //@InsertDefinition
  @InsertExDefinition
  int insertJbaObj(T t);

  //@InsertDefinition(strategy = SelectorStrategy.IGNORE_NULL)
  @InsertExDefinition(strategy = SelectorStrategy.IGNORE_NULL)
  int insertIgnoreNull(T t);

  //@InsertDefinition(strategy = SelectorStrategy.CERTAIN)
  @InsertExDefinition(strategy = SelectorStrategy.CERTAIN)
  /**
   * 指定参数的插入
   * @param certainty
   * @return
   */
  int insertCertain(Certainty<T> certainty);

  @UpdateDefinition
  int updateJbaById(T t);

  /**
   * 忽略空
   * @param t
   * @return
   */
  @UpdateDefinition(strategy = SelectorStrategy.IGNORE_NULL)
  int updateByIdIgnoreNull(T t);

  /**
   * 不允空
   * @param certainty
   * @return
   */
  @UpdateDefinition(strategy = SelectorStrategy.CERTAIN, where = " id = #{entity.id}")
  int updateByIdCertain(Certainty<T> certainty);

  /**
   * 查询功能
   * 这里的作用是演示
   * TODO  domainClass = Map.class, 现阶段只能返回 @Entity 的实体类
   * 例子1： KbInfoTypeService.getListV2ByUnitNo
   * 例子2： CertaintyUtil.createCertainty
   * @param certainty  传递查询参数
   *  Set<String> includes = new HashSet<>();
   * includes.add("unitNo");
   * Certainty<KbInfoType> certainty  =Certainty.includes(type, includes);
   *
   *  由于 where 不为空，故查询条件不被限制
   * @return
   */
  @SelectDefinition(strategy = SelectorStrategy.CERTAIN, where = "", domainClass = User.class)
  int selectJbaByNoDemo(Certainty<T> certainty);


  /**
   * 查询功能
   * 这里的作用是演示
   * TODO  domainClass = Map.class, 现阶段只能返回 @Entity 的实体类
   * 例子1： RcUserInfoService.getJbaByUserNo
   * 例子2： CertaintyUtil.createCertainty
   * @param certainty  传递查询参数
   *  Set<String> includes = new HashSet<>();
   * includes.add("userId");
   * Certainty<KbInfoType> certainty  =Certainty.includes(type, includes);
   *
   *  由于 where 不为空，故查询条件被限制为userId
   * @return
   */
  @SelectDefinition(strategy = SelectorStrategy.CERTAIN,where ="userId = #{"+ Constant.CERTAINTY_ENTITY_KEY+".userId}", domainClass = User.class)
  User getJbaByNoDemo(Certainty<T> certainty);



  @SelectDefinition(strategy = SelectorStrategy.CERTAIN,where ="userId = #{"+ Constant.CERTAINTY_ENTITY_KEY+".id}", domainClass = User.class)
  User getJbaByIdDemo(Certainty<T> certainty);


  /**
   * 支持selectKey 生成序列的功能
   * @param t
   * @return
   */
  @InsertExDefinition()
  int insertJbaExObj(T t);



}
